#include <stdio.h>

struct Vector{

    float x, y, z;

    Vector() {}

    Vector(float xValue, float yValue, float zValue) : x(xValue), y(yValue), z(zValue) {}

    Vector operator+(const Vector & v) const {
        return Vector(x+v.x, y +v.y, z + v.z);
    }

    Vector operator-(const Vector & v) const {
        return Vector(x-v.x, y-v.y, z-v.z);
    }

    float Length() const {
        return sqrt(x*x + y*y + z*z);
    }

    float Dot(const Vector & v) const {
        return x*v.x + y*v.y + z*v.z;
    }

    Vector Scale(float k) const {
        return Vector(x*k, y*k, z*k);
    }

    // 与向量v的夹角(弧度)
    float AngleRadian(const Vector & v) const {
        return acos(Dot(v));
    }

    // 与向量v的夹角(角度)
    float AngleDegree(const Vector & v) const {
        AngleRadian(v) * M_1_PI * 180.0f;
    }

    // 在向量v上的投影向量
    Vector Proj(const Vector & v) const {
        float k = Dot(v) * Length();
        return v.Scale(k);
    }

    // 沿向量v分解, 一个平行于v, 一个垂直于v
    void Decompose(const Vector & v, Vector & vParallel, Vector & vPerpendicular) const {
        vParallel = Proj(v);
        vPerpendicular = this->operator-(vParallel);
    }

    // 分析 于 向量v 的方向关系
    enum Relation {
        Perpendicular,  // 垂直
        Forward,   // 同方向, 夹角小于90度
        Backward,   // 反方向, 夹角大于90度
    };
    Relation RelationTo(const Vector & v) const {
        float p = Dot(v);
        if (p > 0) { return Forward; }
        if (p < 0) { return Backward; }
        return Perpendicular;
    }

    Vector Cross(const Vector& v) const {
        return Vector(y*v.z - z*v.y, z*v.x - x*v.z, x*v.y - y*v.x);
    }

};


int main(int argc, char ** argv) {

 

    return 0;

}